package internal

import (
	"bytes"
	"encoding/binary"
)

type Pkt struct {
	buf []byte
}

func (p *Pkt) Pack() error {
	return nil
}

func (p *Pkt) UnPack(data []byte) error {
	return nil
}

func (p *Pkt) GetData() []byte {
	return []byte{}
}

func (p *Pkt) GetBuf() []byte {
	return p.buf
}

//网络头部
type HeadPkt struct {
	Pkt
	Id  uint32
	Len uint32
	Msg []byte
}

func NewHeadPkt() *HeadPkt {
	return &HeadPkt{}
}

func (hp *HeadPkt) GetHeadLen() uint32 {
	return 8
}

func (hp *HeadPkt) GetData() []byte {
	return hp.Msg
}

func (hp *HeadPkt) Pack() error {
	buf := bytes.NewBuffer([]byte{})

	if err := binary.Write(buf, binary.BigEndian, hp.Id); err != nil {
		return err
	}
	if err := binary.Write(buf, binary.BigEndian, hp.Len); err != nil {
		return err
	}
	if err := binary.Write(buf, binary.BigEndian, hp.Msg); err != nil {
		return err
	}

	hp.buf = buf.Bytes()

	return nil
}

func (hp *HeadPkt) UnPack(data []byte) error {
	buf := bytes.NewReader(data)

	if err := binary.Read(buf, binary.BigEndian, &hp.Id); err != nil {
		return err
	}
	if err := binary.Read(buf, binary.BigEndian, &hp.Len); err != nil {
		return err
	}
	// if err := binary.Read(buf, binary.BigEndian, hp.Msg); err != nil {
	// 	return err
	// }

	return nil
}

//日志包
type LogPkt struct {
	Pkt
	Level uint32
	Msg   []byte
}

func NewLogPkt() *LogPkt {
	return &LogPkt{}
}

func (lp *LogPkt) GetHeadLen() uint32 {
	return 4
}

func (lp *LogPkt) Pack() error {
	buf := bytes.NewBuffer([]byte{})

	if err := binary.Write(buf, binary.BigEndian, lp.Level); err != nil {
		return err
	}

	if err := binary.Write(buf, binary.BigEndian, lp.Msg); err != nil {
		return err
	}

	lp.buf = buf.Bytes()

	return nil
}

func (lp *LogPkt) UnPack(data []byte) error {
	buf := bytes.NewReader(data)
	if err := binary.Read(buf, binary.BigEndian, &lp.Level); err != nil {
		return err
	}

	return nil
}
